package me.flyray.bsin.infrastructure.biz.paychannel.joinpay.domain.response;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 汇聚支付（分账）API - 统一支付响应实体类
 * <p>
 * UniPayResponse 类用于封装解析汇聚支付网关返回的同步或异步通知数据。
 *
 * @author Gemini
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UniPayResponse {

    /**
     * 版本号
     * <ul>
     * <li><b>说明:</b> 当前版本号为 2.5</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> D(3,1)</li>
     * </ul>
     */
    @JsonProperty("r0_Version")
    private String version;

    /**
     * 商户编号
     * <ul>
     * <li><b>说明:</b> 商户在支付平台的唯一身份标识。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(15)</li>
     * </ul>
     */
    @JsonProperty("r1_MerchantNo")
    private String merchantNo;

    /**
     * 商户订单号
     * <ul>
     * <li><b>说明:</b> 商户系统提交的唯一订单号。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(50)</li>
     * </ul>
     */
    @JsonProperty("r2_OrderNo")
    private String orderNo;

    /**
     * 支付金额
     * <ul>
     * <li><b>说明:</b> 单位为元，精确到分，保留两位小数。例如：10.23。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> D(16,2)</li>
     * </ul>
     */
    @JsonProperty("r3_Amount")
    private BigDecimal amount;

    /**
     * 币种
     * <ul>
     * <li><b>说明:</b> 默认为1(人民币)。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(10)</li>
     * </ul>
     */
    @JsonProperty("r4_Cur")
    private String cur;

    /**
     * 公用回传参数
     * <ul>
     * <li><b>说明:</b> 如果商户请求时传递了该参数，则返回给商户时会原值返回。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(100)</li>
     * </ul>
     */
    @JsonProperty("r5_Mp")
    private String mp;

    /**
     * 交易类型
     * <ul>
     * <li><b>说明:</b> 商户在请求时提交的交易类型，原值返回。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(50)</li>
     * </ul>
     */
    @JsonProperty("r6_FrpCode")
    private String frpCode;

    /**
     * 交易流水号
     * <ul>
     * <li><b>说明:</b> 支付平台生成的流水号。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(30)</li>
     * </ul>
     */
    @JsonProperty("r7_TrxNo")
    private String trxNo;

    /**
     * 银行商户编码
     * <ul>
     * <li><b>说明:</b> 留空。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(20)</li>
     * </ul>
     */
    @JsonProperty("r8_MerchantBankCode")
    private String merchantBankCode;

    /**
     * 响应码
     * <ul>
     * <li><b>说明:</b> 返回100时表示成功，详见附录7.1响应码。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(10)</li>
     * </ul>
     */
    @JsonProperty("ra_Code")
    private String code;

    /**
     * 响应码描述
     * <ul>
     * <li><b>说明:</b> 参见7.1响应码。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(20)</li>
     * </ul>
     */
    @JsonProperty("rb_CodeMsg")
    private String codeMsg;

    /**
     * 结果
     * <ul>
     * <li><b>说明:</b> 根据交易类型的不同，返回不同的支付信息（如二维码地址、支付链接、SDK调起信息等）。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(20) -> (Length may vary based on content)</li>
     * </ul>
     */
    @JsonProperty("rc_Result")
    private String result;

    /**
     * 二维码图片码
     * <ul>
     * <li><b>说明:</b> Base64编码的二维码图片。仅当请求参数 q4_IsShowPic=1 且交易类型为主扫时返回。</li>
     * <li><b>必填:</b> 否</li>
     * <li><b>长度:</b> X(2048)</li>
     * </ul>
     */
    @JsonProperty("rd_Pic")
    private String pic;

    /**
     * 签名数据
     * <ul>
     * <li><b>说明:</b> 对返回参数进行加密后的签名，详见5签名机制。</li>
     * <li><b>必填:</b> 是</li>
     * <li><b>长度:</b> X(4000)</li>
     * </ul>
     */
    @JsonProperty("hmac")
    private String hmac;

}
